/*
 * @(#)PACKAGE_NAME 2020/3/7/0007
 *
 * Copy Right@ 人人译视界
 */


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * <pre>
 * @author tuwei
 *
 * @version 0.9
 *
 * 修改版本: 0.9
 * 修改日期: 2020/3/7/0007
 * 修改人 :  tuwei
 * 修改说明: 初步完成
 * 复审人 ：
 * </pre>
 */
public class BIORpcClientProxy {
	private String host;
	private int port;

	public BIORpcClientProxy(String host, int port) {
		this.host = host;
		this.port = port;
	}

	public <T> T clientProxy(final Class<T> interfaceCls) {
		return (T) Proxy.newProxyInstance(interfaceCls.getClassLoader(), new Class<?>[]{interfaceCls}, new InvocationHandler() {
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// 如果调用interfaceCls的方法，则会被动态代理执行到invoke方法
				// 组装参数(类，方法，参数，参数类型)
				// 序列化
				// 进行网络传输
				RpcRequest request = new RpcRequest();
				request.setClassName(method.getDeclaringClass().getName());
				request.setMethodName(method.getName());
				request.setParams(args);
				request.setTypes(method.getParameterTypes());
				BIORpcNetTransport transport = new BIORpcNetTransport(host, port);
				return transport.send(request);
			}
		});
	}
}
